#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QMediaPlayer>
#include <QAudioOutput>
#include <QDate>

#include "messageshowarea.h"
#include "messageeditarea.h"
#include "sessionfriendarea.h"
#include "common.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWidget;
}
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT

private:
    static MainWidget* instance;

public:
    static MainWidget* getInstance();

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

private:
    Ui::MainWidget *ui;

    QWidget* windowLeft;
    QWidget* windowMid;
    QWidget* windowRight;

    // 用户头像
    QPushButton* userAvatar;
    //会话标签页按钮
    QPushButton* sessionTabBtn;
    // 好友标签页按钮
    QPushButton* friendTabBtn;
    // 好友申请标签页按钮
    QPushButton* applyTabBtn;
    // 搜索框
    QLineEdit* searchEdit;
    // 添加好友按钮
    QPushButton* addFriendBtn;

    SessionFriendArea* sessionFriendArea;

    // 消息展示区
    MessageShowArea* messageShowArea;
    // 消息编辑区
    MessageEditArea* messageEditArea;

    QPushButton* extraBtn;

    QLabel* sessionTitleLabel;
    QMap<QString,QString> mTypeIconMap;
    //城市编码
    QMap<QString,QString> mCityMap;
    QSharedPointer<Weather> m_Today;

    // 消息提示铃声
    QMediaPlayer *m_player = nullptr;
    QAudioOutput *m_audioOutput = nullptr;

    QLabel* label_city;
    QLabel* label_icon;
    QLabel* label_lowheigh;
    QLabel* label_temperture;

    enum ActiveTab{
        SESSION_LIST,
        FRIEND_LIST,
        APPLY_LIST
    };
    ActiveTab activeTab = SESSION_LIST;

public:
    // 初始化主窗口
    void initMainWindow();
    // 左窗口
    void initLeftWindow();
    // 中间窗口
    void initMidWindow();
    // 右侧窗口
    void initRightWindow();

    void initSignalSlot();
    void initWebsocket();

    void initWeatherIcon();

    void switchTabToSession();
    void switchTabToFriend();
    void switchTabToApply();

    void loadSessionList();
    void loadFriendList();
    void loadApplyList();

    void updateFriendList();
    void updateChatSessionList();
    void updateApplyList();
    void updateForecast();

    void loadRecentMessage(const QString &chatSessionId);
    void updateRecentMessage(const QString &chatSessionId);

    void switchSession(const QString& userId);
    MessageShowArea* getMessageShowArea();

    void initCityCode(); // 初始化城市数据,读取解析一个json文件，将数据存到map里面
    QString getCityCode(QString cityName); //在map里面根据城市名字找对应编码
};
#endif // MAINWIDGET_H
